ホームに戻る
出典 :
INotifyPropertyChanged インターフェイス (System.ComponentModel) | Microsoft Learn INotifyPropertyChangedプロパティ実装方法まとめ C#3からC#7、Fodyも #.NET - Qiita INotifyPropertyChanged.PropertyChanged イベント (System.ComponentModel) | Microsoft Learn PropertyChangedEventArgs クラス (System.ComponentModel) | Microsoft Learn
関連 :
データバインディング MVVMパターン MVVM Toolkit ReactiveProperty
目次 :

INotifyPropertyChanged とは

自身のプロパティが変更されたことをクラス外に通知するためのインタフェース。 実装することで、プロパティが変更された際にイベントを発行することができる。 画像

データバインディングとの関係

INotifyPropertyChangedは主にデータバインディングの手段として用いられる。 即ち、( MVVM における ViewModel の)プロパティの変更をUI( MVVM の View )コントロールに通知する(もしくは逆)ために用いる。

実装例

以下、C#7における実装例を示す。
通知する側
// プロパティが変更された際に通知を行う Sample クラス public class Sample : INotifyPropertyChanged; { // プロパティが変更された際に実行するイベントフック public event PropertyChangedEventHandler EventHook; // PropertyChanged (プロパティ変更)イベント発行 private void RaiseEvent( [CallerMemberName]string propertyName = null ) { // EventHook が null でなければ実行 // 第1引数 : オブジェクト(イベントセンダ) // 第2引数 : PropertyChanged イベント引数 EventHook?.Invoke( this, new PropertyChangedEventArgs(propertyName) ); } // プロパティの実体となるフィールド private string _Name = "Hejlsberg"; // プロパティ public string Name { // get アクセサ get => _Name; // set アクセサ set { // 値が異なる(更新される)場合 if (value != _Name) { // 値を更新 _Name = value; // イベント発行 RaiseEvent( nameof(Name) ); } } } }
通知を受ける側
: Sample sample = new Sample(); // イベントハンドラを登録 sample.EventHook += (s, e) => { Console.WriteLine($"{e.PropertyName} が変更されました。"); } :
上記は Sample クラスの Name プロパティが変更された際に通知を行う場合のコードである。
通知を受ける側は Sample の EventHook に、実行させたいイベントハンドラ(コールバック)を登録する。
通知する側( Sample )は Name プロパティが変更された際にPropertyChangedイベントを発行する(フックに登録されたコールバックを実行する)。
その際に変更されたプロパティ名を( nameof() で取得して)渡すため、受け側ではどのプロパティが変更されたのかをイベント引数から取得することができる。

WPFにおける INotifyPropertyChanged 実装の支援

上述のように、INotifyPropertyChangedの実装は煩雑であるが、 ReactivePropertyを用いることで比較的簡単に実装を行うことができる。 詳細は各リンク先を参照。